AWS Configの高度なクエリの使い方を詳細に調べてみた
こんにちは、臼田です。
地味なアップデートですが、先日AWS Configで高度なクエリが使えるようになりました。
地味ですがSQLが書けるということで、もしかして可能性が無限にあるのでは?と思って活用方法について検討してみたのですが、その過程で調べて情報や確認したことについてまとめてみます。
今後活用方法を検討する方の参考になれば幸いです。
参考資料
まだリリースされて間もないのもありますが、2019/03/28現在では下記2点が参考資料(というか情報のほぼ全て)です。
- Querying the Current Configuration State of AWS Resources - AWS Config
- AWS Config Resource Schema | GitHub
前者はクエリの説明、後者はAWS Configのデータのスキーマ定義です。
クエリを書く際には結局スキーマを意識する必要があるので、どんな情報を使えるのかはGitHubの定義を見ないといけなくなります。
ちなみに、スキーマがよくわからないときにとりあえず使うSELECT *
は残念ながら使えません。理由は後述します。
SQLの機能と制約
AWS ConfigのSQLにおける機能と制約を前者のAWSドキュメントから抜粋・意訳して並べてみます。詳細はドキュメントを見てね★ミ
機能
- 設定プロパティに基づいてAWSリソースの現在の設定状態をクエリできる
- 設定データ、タグ、関係などのクエリをサポート
- AWS ConfigでサポートされているすべてのAWSリソースタイプが対象
- クエリに使えるCIプロパティはGitHub参照
- 制限付きのSQL SELECTコマンドのサブセット
- AVG、COUNT、MAX、MIN、SUMなどの集計機能をサポート
肝になるのは、現在の設定だけをクエリできるというところです。AWS Configでは、指定したリソースの設定がどのように変更されていったか(誰がいつ何を何に変えた、等)を追う使い方もしますが、過去の設定値などはクエリできません。
また、AWS Configの機能なので、当然AWS Configに対応していないリソースについてはクエリできません。
制約
様々な制約があるので主要なものを抜粋します。
- FROM、AS、JOIN、DISTINCT、HAVING、およびALLキーワードはサポート外
- 配列データはフラット化して評価される
SELECT *
した場合は一部の共通プロパティのみ返される- ワイルドカードはプロパティ値でのみサポート
- GROUP BY句に含むことのできるプロパティは1つだけ
- 集約した場合の結果は最大500件まで
SQLが書けると言ってもいろいろ限定的にはなっていますね。JOIN出来ないので自由度は低いです。
SELECT *
がスキーマの確認に使えないというのはこれが理由です。素直にGitHubの定義を(すごく頑張って)確認しましょう。
また、地味ですがコンソール上でクエリしたあとCSVダウンロードとかもできません。更に出力結果をゴニョゴニョしたい場合には、CLIからの実行がいいかもしれません。
スキーマの概要
GitHubで公開されているスキーマを、クエリを書くのに最低限必要なレベルで抜粋します。
サポートしているスキーマのタイプ
boolean
:ブール値cidr_block
:CIDRブロック(例192.168.1.0/24
)date
:日時インスタンスfloat
:浮動小数点値integer
整数値ip
:IPアドレス(例えば、192.168.1.1
)string
:文字シーケンス
これは特に説明不要だと思います。
スキーマのたどり方
全部のスキーマの一覧はこちら。ただこれを見るのは現実的ではないです。
こちらにリソースタイプ毎に並んでいるので、確認したいリソースタイプを絞って見てみましょう。
試しにEC2インスタンスのスキーマを見てみたりするとわかりますが、階層が深くて結局どんなものが取れるのか感覚的に分かりづらいときがあります。
そんな場合には、階層の浅いところでクエリを実行するといいです。例えば下記のようなクエリです。
SELECT resourceId, configuration WHERE resourceType = 'AWS::EC2::Instance'
実行結果は下記のようになります。
configuration
部分は複数のデータが入っているため、結果には値は表示されずリンクとなります。これを押すと下記が表示されます。
具体的にどんなデータが入っているか見れるので、ここから更にクエリを練りやすくなると思います。
まとめ
AWS Configの高度なクエリについて、その機能や制約、スキーマなどの情報についてまとめました。
複数のリソースタイプに跨ってクエリを書けるところはいいですが、正直すごい活用方法はなかなか思いつきませんでした。
サンプルSQLにあるような活用方法がベターかもしれません。
この情報を見て、すっごくいい活用方法を思いついたら、ぜひ教えてください!